﻿namespace Logica{
using TUVienna.CS_CUP.Runtime;
%%
%cup
%public
%class interprete_scanner
%state comment1
%state comment2

DIG=[0-9]
ID=([a-z]|[A-Z])([a-z]|[A-Z]|[0-9]|"_")*
WHITE_SPACE_CHAR=[\n\ \t\b\012]
STRING_TEXT=(\\\"|[^\n\"]|\\{WHITE_SPACE_CHAR}+\\)*

%%
<YYINITIAL>"/*" {yybegin(comment1); break;}
<YYINITIAL>"//" {yybegin(comment2); break;}
<comment1>"*/" {yybegin(YYINITIAL); break;}
<comment1>{WHITE_SPACE_CHAR} {break;}
<comment1>. {break;}
<comment2>\n {yybegin(YYINITIAL); break;}
<comment2>. {break;}


"#"			 { System.Console.Out.WriteLine("numeral"); return new Symbol(interprete_sym.numeral);          }
"include"	 { System.Console.Out.WriteLine("include"); return new Symbol(interprete_sym.include);          }
"<"			 { System.Console.Out.WriteLine("menorque"); return new Symbol(interprete_sym.menorque);         }
"stdio.h"    { System.Console.Out.WriteLine("stdio"); return new Symbol(interprete_sym.stdio);            }
">"			 { System.Console.Out.WriteLine("mayorque"); return new Symbol(interprete_sym.mayorque);         }
"int"	     { System.Console.Out.WriteLine("tk_int"); return new Symbol(interprete_sym.tk_int);           }
"m"			 { System.Console.Out.WriteLine("m"); return new Symbol(interprete_sym.m);		           }
"="			 { System.Console.Out.WriteLine("igual"); return new Symbol(interprete_sym.igual);            }
";"			 { System.Console.Out.WriteLine("puntocoma"); return new Symbol(interprete_sym.puntocoma);        }	
"p"			 { System.Console.Out.WriteLine("p"); return new Symbol(interprete_sym.p);			       }   
"pila"		 { System.Console.Out.WriteLine("pila"); return new Symbol(interprete_sym.pila);             }
"mem"		 { System.Console.Out.WriteLine("mem"); return new Symbol(interprete_sym.mem);		       }
"["			 { System.Console.Out.WriteLine("abrecorchete"); return new Symbol(interprete_sym.abrecorchete);     }
"]"			 { System.Console.Out.WriteLine("cierracorchete"); return new Symbol(interprete_sym.cierracorchete);   }
","			 { System.Console.Out.WriteLine("coma"); return new Symbol(interprete_sym.coma);			   }
"t__0"		 { System.Console.Out.WriteLine("temporal_fin"); return new Symbol(interprete_sym.temporal_fin);     }
"void"		 { System.Console.Out.WriteLine("tk_void"); return new Symbol(interprete_sym.tk_void);          }
"("			 { System.Console.Out.WriteLine("abreparentesis"); return new Symbol(interprete_sym.abreparentesis);   }
")"			 { System.Console.Out.WriteLine("cierraparentesis"); return new Symbol(interprete_sym.cierraparentesis); }
"{"			 { System.Console.Out.WriteLine("abrellave"); return new Symbol(interprete_sym.abrellave);		   }
"}"		     { System.Console.Out.WriteLine("cierrallave"); return new Symbol(interprete_sym.cierrallave);	   }
"goto"		 { System.Console.Out.WriteLine("tk_goto"); return new Symbol(interprete_sym.tk_goto);    	   }
":"			 { System.Console.Out.WriteLine("dospuntos"); return new Symbol(interprete_sym.dospuntos);		   }
"Lfin"		 { System.Console.Out.WriteLine("etiqueta_fin"); return new Symbol(interprete_sym.etiqueta_fin);     }
"+"			 { System.Console.Out.WriteLine("mas"); return new Symbol(interprete_sym.mas);			   }
"-"			 { System.Console.Out.WriteLine("menos"); return new Symbol(interprete_sym.menos);			   }
"*"			 { System.Console.Out.WriteLine("multiplicar"); return new Symbol(interprete_sym.multiplicar);      }
"/"			 { System.Console.Out.WriteLine("diagonal"); return new Symbol(interprete_sym.diagonal);         }
"%"			 { System.Console.Out.WriteLine("mod"); return new Symbol(interprete_sym.mod);			   }
"<="		 { System.Console.Out.WriteLine("menorigual"); return new Symbol(interprete_sym.menorigual);       }
">="		 { System.Console.Out.WriteLine("mayorigual"); return new Symbol(interprete_sym.mayorigual);       }
"=="		 { System.Console.Out.WriteLine("igualigual"); return new Symbol(interprete_sym.igualigual);       }
"!="		 { System.Console.Out.WriteLine("diferente"); return new Symbol(interprete_sym.diferente);        }
"main"       { System.Console.Out.WriteLine("tk_main"); return new Symbol(interprete_sym.tk_main);          }
"if"		 { System.Console.Out.WriteLine("tk_if"); return new Symbol(interprete_sym.tk_if);			   }
"printf"     { System.Console.Out.WriteLine("printf"); return new Symbol(interprete_sym.printf);		   }

<YYINITIAL> {DIG}+ { System.Console.Out.WriteLine("numero"); return (new Symbol(interprete_sym.numero, yytext()));}
<YYINITIAL> "t"{DIG}+ { System.Console.Out.WriteLine("temporal"); return (new Symbol(interprete_sym.temporal, yytext()));}
<YYINITIAL> "tm"{DIG}+ { System.Console.Out.WriteLine("temporal"); return (new Symbol(interprete_sym.temporal, yytext()));}
<YYINITIAL> "L"{DIG}+ { System.Console.Out.WriteLine("etiqueta"); return (new Symbol(interprete_sym.etiqueta, yytext()));}
<YYINITIAL> {ID} {
					 System.Console.Out.WriteLine(yytext()); return (new Symbol(interprete_sym.identificador, yytext()));	
				}	
<YYINITIAL> \"{STRING_TEXT}\" {
       System.Console.Out.WriteLine(yytext().Substring(1, yytext().Length - 2)); return new Symbol(interprete_sym.cadena, yytext().Substring(1, yytext().Length - 2));
}

[ \t\r\n\f] { /* ignore white space. */break; }
. { System.Console.Error.WriteLine("Illegal character: "+yytext());break; }
